package com.wk.springboot.hwjs;

import java.util.Scanner;
import java.util.Stack;

/**
 * @Classname WordUtils
 * @Description TODO
 * @Date 2020/8/27 16:35
 * @Author by weikai
 */
public class WordUtils {

  public static void main(String[] args) {

/*    Scanner scanner = new Scanner(System.in);
    while(scanner.hasNext()){
      String str = scanner.nextLine();
      System.out.println(getLastWordLength(str));
    }*/

  int[] ints = new int[]{23,11,34,12,43,65,23};
  int[] ints1 = ints1(ints);
  int[] ints2 = ints(ints);
  for (int i=0; i< ints.length; i++){
    System.out.print(ints1[i]+",");
  }

  for (int i=0; i< ints.length; i++){
      System.out.print(ints2[i]+",");
  }

  }

  public static int getLastWordLength(String word){
    String[] strings = word.split(" ");
    return strings[strings.length-1].length();
  }

  /**
   * 题目：给出一个数组，遍历数组。每遍历到一个下标的数据，判断后面是否有比此数据大的元素，有就把对应放到对应下标，
   * 没有就输出0
   *
   * 例如：
   * 输入：[23,11,34,12,43,65,23]
   * 输出：[34,34,43,43,65,0,0]
   *
   * 解题思路：
   * 1、可以通过简单的二次遍历实现
   *    优点：简单，易实现
   *    缺点：性能低
   *
   * 2、通过数据结构实现
   *
   */
  /**
   * 1、二次遍历实现
   * @return
   */
  public static int[] ints1(int[] ints){
    if(null == ints){
      return null;
    }
    int length = ints.length;

    if(length == 0){
      return ints;
    }

    int[] ints1 = new int[length];

    for(int i=0; i<length; i++){
      int num = ints[i];

      if(i == length-1){
        ints1[i] = 0;
        break;
      }

      for (int j=i+1; j<length; j++){
        if(num < ints[j]){
          ints1[i] = ints[j];
          break;
        }

        if(j == length-1){
          ints1[i] = 0;
        }
      }
    }
    return ints1;
  }

    /**
     * 通过栈数据结构实现
     */
    public static int[] ints(int[] ints){

        if(null == ints){
            return null;
        }
        Stack<Integer> stack = new Stack<>();
        int length = ints.length;
        int[] returnInts = new int[length];
        for(int i=0;i<length;i++){
            /**
             * 遍历数组时，先给返回的数组一个初始值0；
             * 如果后续栈操作没有操作到对应下标，则说明数组中没有比这个数更大的数据了，对应值应为0
             */
            returnInts[i] = 0;
            Integer num = stack.isEmpty()?0:stack.peek();//第一次遍历会有栈为空
            if(ints[num] >= ints[i]){//如果栈顶数据大于操作数，则操作数下标入栈
                stack.push(i);
            }else {
                while (!stack.isEmpty()&&ints[num=stack.peek()] < ints[i]){//判断栈顶下标对应数值与操作数值的大小
                    returnInts[num] = ints[i];//把操作数值赋值给栈顶下标
                    stack.pop(); //弹栈
                }
                stack.push(i);//操作数下标入栈
            }
        }
        return returnInts;
    }

}
